/**
 * 用来将 tokens 转化为DOM字串.
 * 这里我认为有优化的地方，这里的 renderTemplate 函数应该可以
 * 同时处理 data为对象和data为数组（更一步的，布尔值）的情况，那么，
 * 这样一来就只要写一个函数即可。
 */
import lookup from './lookup';


/**
 * @description ['#', 'arr', Array(m)]
 * @param {array} token 注意不是tokens
 * @param {object} data 数据
 */
function parseArray (token, data) {
  // 此时v是数组，或者布尔值
  let v = lookup(data, token[1]);

  let ret = '';

  for (let i = 0, len = v.length; i < len; i++) {
    // 因为 renderTemplate 只能接受对象，所以自然的
    // 子数组无法处理，'.'通配符也无法识别
    // 所以给 v[i] 对象增加一个'.'属性……
    ret += renderTemplate(token[2], {
      ...v[i],
      '.': v[i]
    });
  }

  return ret;
}

/**
 * @description 渲染字符串
 * @param {array} tokens 数组
 * @param {object} data 对象，不是数组
 */
function renderTemplate (tokens, data) {
  let ret = '';

  for (let i = 0, len = tokens.length; i < len; ++i) {
    let token = tokens[i];
    if (token[0] == 'text') {
      ret += token[1];
    } else if (token[0] == 'name') {
      ret += lookup(data, token[1]);
    } else if (token[0] == '#') {
      // 开始递归处理有标记符的 token
      ret += parseArray(token, data);
    }
  }

  return ret;
}

export default renderTemplate;
